package org.gastomuito.server;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class TransacaoContabil implements Serializable {

    private static final long serialVersionUID = 922467865000806011L;

    private Date quando;

    private Set<EntradaContabil> entradas = new HashSet<EntradaContabil>();

    private boolean processada;

    public TransacaoContabil(Date quando) {
        super();
        this.quando = quando;
    }

    public void adiciona(double quantidade, ContaContabil conta) {
        adiciona(quantidade, conta, "");
    }

    public void adiciona(double quantidade, ContaContabil conta,
            String descricao) {
        if (processada) {
            throw new IllegalStateException();
        }
        EntradaContabil entrada =
                new EntradaContabil(quando, conta, this, quantidade);
        entrada.setDescricao(descricao);
        this.entradas.add(entrada);
    }

    public void processar() {
        if (!podeProcessar()) {
            throw new IllegalStateException();
        }

        for (EntradaContabil entrada : this.entradas) {
            entrada.processar();
        }
        processada = true;
    }

    public boolean podeProcessar() {
        return balanco() == 0.0;
    }

    private double balanco() {
        if (entradas.isEmpty()) {
            return 0.0;
        }

        Iterator<EntradaContabil> it = this.entradas.iterator();
        EntradaContabil primeiraEntrada = it.next();
        double result = primeiraEntrada.getQuantidade();
        while (it.hasNext()) {
            result += it.next().getQuantidade();
        }

        return result;
    }

}
